package j18;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class J18_JDBCSetup {

	// JDBC 접속 정보
	private static final String DRV = "oracle.jdbc.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@//localhost:1521/xe";
	private static final String USR = "scott";
	private static final String PWD = "TIGER";
	
	// SQL문 작성
	private static final String insertSQL = "INSERT INTO sungjuk (sjno,name,kor,eng,mat)"+
			"VALUES (SJNO.nextval,'김태희',89,78,56)";
	private static final String selectSQL = "select * from sungjuk order by sjno desc";
	
	public static void main(String[] args) {
		
		// 오라클을 이용한 JDBC 프로그래밍 기초
		// 1. JDBC 드라이버를 메모리에 적재하여
		// 객체로 생성하고 이것을 DriverManager에 등록
		
		// 2. DriverManager의 getConnection 메서드를
		// 이용해서 데이터베이스 연결 객체를 생성함
		
		// 3. PrepareStatment로 실행할 SQL문 객체를 생성
		
		// 4. 실행 SQL문이 insert, update, delete라면 executeUpdate()를 사용하고 결과는 int로 받음
		//	  실행 SQL문이 select 라면 executeQuery를 사용하고 결과는 resultSet으로 받음
		
		// 5. ResultSet으로 받은 결과는
		// 먼저 rs.next()로 읽어올 레코드(행)를 가리킨 후
		// rs.getXXX(필드번호) 또는
		// rs.getXXX(필드이름) 으로
		// 테이블의 각 필드 값을 처리 할 수 있음

		// 6. JDBC 작업이 끝나면 연결중인 데이터베이스 접속을 끊고 
		// 관련객체(conn,ps,rs)는 메모리에서 제거함 
		
		Connection conn = null;
		PreparedStatement ps = null; // SQL 객체 생성용
		ResultSet rs = null;
		
		
		try{
			Class.forName(DRV);		//1번.
			conn = 
			DriverManager.getConnection(URL, USR, PWD);		//2번
			ps = conn.prepareStatement(insertSQL);
			int cnt = ps.executeUpdate();		//4번
			System.out.println(cnt+"건의 데이터 입력");
			
			ps.close(); 	//또 다른 SQL문 작성하기 위해
							//기존 ps 객체 제거
			ps = conn.prepareStatement(selectSQL);
			rs = ps.executeQuery();
			
			// ResultSet에서 결과를 레코드 단위로 꺼내 차례대로 출력
			
			while(rs.next()) {  //5번!!
				// ResultSet에서 읽어올 레코드가 있으면
				System.out.println(rs.getInt(1));
				System.out.println(rs.getString("name"));
			}
		} 	catch(Exception ex) {
			ex.printStackTrace();
		}	finally {			// 6번!!
			
			// JDBC 작업이 끝난 후 메모리에서 객체 제거
			if (rs !=null)
				try {
					rs.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			if (ps !=null)
				try {
					ps.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			if (conn !=null)
				try {
					conn.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
		}
	}

}
